package com.csx.data.orm.jpa.IdGenerator;

import cn.hutool.core.util.StrUtil;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


import java.io.Serializable;
import java.util.UUID;

/**
 * <p> what does this class do ? </p>
 * <p> How does it work ?</p>
 * <p> Why does it do this ?</p>
 *
 * @author cuisongxu
 * @date 2023/10/30 周一 10:19
 */

public class CustomIdGenerator extends IdentityGenerator {

    private static final Logger logger = LoggerFactory.getLogger(CustomIdGenerator.class);

    public static String[] chars = new String[]{"a", "b", "c", "d", "e", "f",
            "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
            "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
            "W", "X", "Y", "Z"};


    public static String generateShortUuid() {
        StringBuffer shortBuffer = new StringBuffer();
        String uuid = UUID.randomUUID().toString().replace("-", "");
        for (int i = 0; i < 8; i++) {
            String str = uuid.substring(i * 4, i * 4 + 4);
            int x = Integer.parseInt(str, 16);
            shortBuffer.append(chars[x % 0x3E]);
        }
        return shortBuffer.toString();

    }

    @Override
    public Serializable generate(SharedSessionContractImplementor s, Object obj) throws HibernateException {
        Serializable id = s.getEntityPersister(null, obj).getClassMetadata().getIdentifier(obj, s);
        if (id != null && StrUtil.isNotBlank(id.toString())) {
            return id;
        } else {
            Long generatedId;
            try {
                SerialNumberService serialNumberService = (SerialNumberService) SpringContextUtil
                        .getBean("serialNumberService");
                String moduleType = obj.getClass().getSimpleName();
                String tempId = serialNumberService.queryId(moduleType);
                generatedId = Long.parseLong(tempId);
                System.out.println(generatedId);
            } catch (Exception e) {
                logger.error("use gw serialNumber failed! start use uuid generator.");
                String tempId = generateShortUuid();
                generatedId = Long.parseLong(tempId);
                return generatedId;
            }
            if (StrUtil.isBlank(generatedId.toString())) {
                //return super.generate(s, obj);
                String tempId = generateShortUuid();
                generatedId = Long.parseLong(tempId);
                return generatedId;
            }
            return generatedId;
        }
    }

}
